package prh25.biblioteca.service;

import java.util.List;

import org.apache.commons.validator.GenericValidator;

import prh25.biblioteca.entity.Documento;
import prh25.biblioteca.entity.Professor;
import prh25.biblioteca.entity.Revisor;
import prh25.biblioteca.entity.Usuario;
import prh25.biblioteca.entity.dao.RevisorDAO;
import prh25.biblioteca.entity.dao.UsuarioDAO;
import prh25.biblioteca.entity.dao.hibernate.HibernateDAOFactory;
import prh25.biblioteca.entity.dao.hibernate.HibernateUtil;
import prh25.biblioteca.service.exception.RestricaoIntegridadeException;
import prh25.biblioteca.service.exception.UsuarioExistenteException;

public class RevisorServiceImpl implements RevisorService {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private RevisorDAO revisorDAO;
	
	private String texto;
	
	public void setRevisorDAO(RevisorDAO revisorDAO) {
		this.revisorDAO = revisorDAO;
	}
	
	@Override
	/**
	 * Salva um revisor no banco de dados.
	 * @param revisor a ser salvo no banco de dados.
	 */
	public Integer criar(Revisor revisor) {
		
		revisor.getEndereco().uid();
		
		revisorDAO = HibernateDAOFactory.DEFAULT.buildRevisorDAO();
		validar(revisor);
		checkDuplicidade(revisor);
		// Inicio da transacao

		try {
			HibernateUtil.beginTransaction();
			revisorDAO.saveOrUpdate(revisor);
			HibernateUtil.commitTransaction();
		} catch (Exception ex) {
			ex.printStackTrace();
			HibernateUtil.rollbackTransaction();
			// Aqui deve ser adiconada o url de aviso de erro
		}finally{
			HibernateUtil.getSession().flush();
			HibernateUtil.getSession().clear();
		}
		return revisor.getId();
	}
	
	/**
	 * Busca um revisor pelo seu id.
	 * @param id - Id a ser buscado.
	 * @return Revisor que possui o id buscado.
	 */
	public Revisor recuperarPorId(Integer id) {
		return revisorDAO.getById(id);
	}
	
	/**
	 * Valida os dados de um revisor.
	 * @param revisor - Revisor a ter os dados validados.
	 * @throws RestricaoIntegridadeException - Excecao lancada se houve alguma
	 * restricao de integridade.
	 */
	private void validar(Revisor revisor) throws RestricaoIntegridadeException {
		
		if (GenericValidator.isBlankOrNull(revisor.getEmail()))
			throw new RestricaoIntegridadeException("Dados incompleto");
		if (GenericValidator.isBlankOrNull(revisor.getNome()))
			throw new RestricaoIntegridadeException("Dados incompleto");
		if (GenericValidator.isBlankOrNull(revisor.getLogin()))
			throw new RestricaoIntegridadeException("Dados incompleto");
		if (GenericValidator.isBlankOrNull(revisor.getSenha()))
			throw new RestricaoIntegridadeException("Dados incompleto");
		if (!GenericValidator.isEmail(revisor.getEmail()))
			throw new RestricaoIntegridadeException("N�o eh um email valido.");
	}
	

	/**
	 * Verifica se o revisor a ser inserido no banco de dados jah existe.
	 * @param revisor - revisor a ser inserido.
	 */
	private void checkDuplicidade(Revisor revisor) {
		UsuarioDAO usuarioDAO = HibernateDAOFactory.DEFAULT.buildUsuarioDAO();
		
		List<Usuario> logins = usuarioDAO.findByLogin(revisor.getLogin());
		
		if (!logins.isEmpty()) 
			throw new UsuarioExistenteException("Usu�rio j� existe");
	}
	
	@Override
	/**
	 * Busca todos os documentos no banco de dados que obedecam ao criterio
	 * de pesquisa passado pelo usuario.
	 * @param pesquisa - Criterio de pesquisa.
	 */
	public List<Documento> listarDocumentos(String pesquisa) {
		DocumentoService servico = new DocumentoServiceImpl();
		return servico.listarDocumentos(pesquisa);
	}

	@Override
	/**
	 * Deleta um arquivo do banco de dados.
	 * @param uid - O identificador unico do arquivo.
	 */
	public boolean excluirDocumento(String uid) {
		DocumentoService servico = new DocumentoServiceImpl();
		return servico.excluirDocumento(uid);
	}

	@Override
	/**
	 * Salva um arquivo no banco de dados.
	 * @param documento - Documento a ser salvo no banco de dados.
	 * @param diretorioAplicacao - diretorio onde se encontra o arquivo.
	 * @return True se o arquivo foi salvo com sucesso, false caso contrario.
	 */
	public boolean finalizarEnvioArquivo(Documento documento, String diretorioAplicacao) {
		DocumentoService servico = new DocumentoServiceImpl();
		return servico.finalizarEnvioArquivo(documento, diretorioAplicacao);
	}

	@Override
	/**
	 * Altera o status de um documento, ou seja, se o documento foi ou nao aceito
	 * @param uid - O identificador unico do documento.
	 * @param situacao - O status atual que o documento se encontra no sistema.
	 * @return O documento que tera o seu status alterado. 
	 */
	public Documento setSituacaoDocumento(String uid, boolean situacao) {
		DocumentoService servico = new DocumentoServiceImpl();
		return servico.setSituacaoDocumento(uid, situacao);
	}
	
	

	

	

	
	

}
